//package com.kitten.note.biz.consumer;
//
//import com.alibaba.nacos.shaded.com.google.common.util.concurrent.RateLimiter;
//import com.kitten.framework.common.utils.JsonUtils;
//import com.kitten.note.biz.constants.MQConstants;
//import com.kitten.note.biz.domain.dataobject.NoteLikeDO;
//import com.kitten.note.biz.domain.mapper.NoteLikeDOMapper;
//import com.kitten.note.biz.model.dto.LikeUnLikeNoteMqDTO;
//import jakarta.annotation.Resource;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.rocketmq.client.producer.SendCallback;
//import org.apache.rocketmq.client.producer.SendResult;
//import org.apache.rocketmq.common.message.Message;
//import org.apache.rocketmq.spring.annotation.ConsumeMode;
//import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
//import org.apache.rocketmq.spring.core.RocketMQListener;
//
//import org.apache.rocketmq.spring.core.RocketMQTemplate;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.messaging.support.MessageBuilder;
//import org.springframework.stereotype.Component;
//
//import java.time.LocalDateTime;
//import java.util.Objects;
//
///**
// * @author kitten
// */
//@Slf4j
//@Component
//@RocketMQMessageListener(consumerGroup = "kittenBook_group_" + MQConstants.TOPIC_LIKE_OR_UNLIKE,
//        topic = MQConstants.TOPIC_LIKE_OR_UNLIKE,
//        consumeMode = ConsumeMode.ORDERLY
//)
//public class LikeUnlikeNoteConsumer implements RocketMQListener<Message> {
//
//    @Resource
//    private NoteLikeDOMapper noteLikeDOMapper;
//
//    private RateLimiter rateLimiter = RateLimiter.create(10); // 每秒最多处理 10 次
//    @Autowired
//    private RocketMQTemplate rocketMQTemplate;
//
//    @Override
//    public void onMessage(Message message) {
//        // 流量削峰：通过获取令牌，如果没有令牌可用，将阻塞，直到获得
//        rateLimiter.acquire();
//
//        // 幂等性: 通过联合唯一索引保证
//
//        // 消息体
//        String bodyJsonStr = new String(message.getBody());
//        // 标签
//        String tags = message.getTags();
//
//        log.info("==> LikeUnlikeNoteConsumer 消费了消息 {}, tags: {}", bodyJsonStr, tags);
//
//        // 根据 MQ 标签，判断操作类型
//        if (Objects.equals(tags, MQConstants.TAG_LIKE)) { // 点赞笔记
//            handleLikeNoteTagMessage(bodyJsonStr);
//        } else if (Objects.equals(tags, MQConstants.TAG_UNLIKE)) { // 取消点赞笔记
//            handleUnlikeNoteTagMessage(bodyJsonStr);
//        }
//    }
//
//
//    /**
//     * 笔记点赞
//     * @param bodyJsonStr
//     */
//    private void handleLikeNoteTagMessage(String bodyJsonStr) {
//        LikeUnLikeNoteMqDTO likeUnLikeNoteMqDTO = JsonUtils.parseObject(bodyJsonStr, LikeUnLikeNoteMqDTO.class);
//        if (Objects.isNull(likeUnLikeNoteMqDTO)) {
//            return;
//        }
//        // 用户ID
//        Long userId = likeUnLikeNoteMqDTO.getUserId();
//        // 点赞的笔记ID
//        Long noteId = likeUnLikeNoteMqDTO.getNoteId();
//        // 操作类型
//        Integer type = likeUnLikeNoteMqDTO.getType();
//        // 点赞时间
//        LocalDateTime createTime = likeUnLikeNoteMqDTO.getCreateTime();
//
//        NoteLikeDO noteLikeDO = NoteLikeDO.builder()
//                .userId(userId)
//                .noteId(noteId)
//                .status(type)
//                .createTime(createTime)
//                .build();
//        int count = noteLikeDOMapper.insertOrUpdate(noteLikeDO);
//        // TODO: MQ计数服务，更新点赞数
//        if (count == 0) {
//            return;
//        }
//        org.springframework.messaging.Message<String> message = MessageBuilder.withPayload(bodyJsonStr).build();
//        String destination = MQConstants.TOPIC_COUNT_NOTE_LIKE;
//        rocketMQTemplate.asyncSend(destination, message, new SendCallback() {
//            @Override
//            public void onSuccess(SendResult sendResult) {
//                log.info("MQ点赞计数服务，更新点赞数成功");
//            }
//
//            @Override
//            public void onException(Throwable throwable) {
//                log.error("MQ计数服务，更新点赞数失败", throwable);
//            }
//        });
//
//    }
//
//    /**
//     * 笔记取消点赞
//     * @param bodyJsonStr
//     */
//    private void handleUnlikeNoteTagMessage(String bodyJsonStr) {
//        LikeUnLikeNoteMqDTO likeUnLikeNoteMqDTO = JsonUtils.parseObject(bodyJsonStr, LikeUnLikeNoteMqDTO.class);
//        if (Objects.isNull(likeUnLikeNoteMqDTO)) {
//            return;
//        }
//        NoteLikeDO noteLikeDO = NoteLikeDO.builder()
//                .userId(likeUnLikeNoteMqDTO.getUserId())
//                .noteId(likeUnLikeNoteMqDTO.getNoteId())
//                .status(likeUnLikeNoteMqDTO.getType())
//                .build();
//        int count = noteLikeDOMapper.update2UnLikeByUserIdAndNoteId(noteLikeDO);
//        // TODO: MQ计数服务，更新点赞数
//        if (count == 0) {
//            return;
//        }
//        org.springframework.messaging.Message<String> message = MessageBuilder.withPayload(bodyJsonStr).build();
//        String destination = MQConstants.TOPIC_LIKE_OR_UNLIKE;
//        rocketMQTemplate.asyncSend(destination, message, new SendCallback() {
//            @Override
//            public void onSuccess(SendResult sendResult) {
//                log.info("MQ取消点赞计数服务，点赞数计数成功");
//            }
//
//            @Override
//            public void onException(Throwable throwable) {
//                log.error("MQ取消点赞计数服务，点赞数计数失败", throwable);
//            }
//        });
//
//    }
//
//}
